#define BOOST_TEST_MODULE testDataElementFieldType

#include <boost/test/unit_test.hpp>

#include "common/helpers/container_helper.hpp"

#include "common/elements/element_maker.h"
#include "common/elements/field_type.h"

#include "datenaro/database/data_elements/data_field_type.h"
#include "datenaro/database/data_gate.h"
#include "datenaro/database/migrator.h"

BOOST_AUTO_TEST_CASE(testDataElementFieldType)
{
    // Создание и апгрейд БД.
    const auto migrationResult = Database::Migrator("test.db").run();
    assert(0 == migrationResult);

    Database::DataGate gate("test.db");

    // Создание тестируемого объекта предметной области с конкретным идентификатором.
    auto first = std::make_shared<Elements::FieldType>();
    first->setId(1);
    first->setItemTypeId(2);
    first->setCaption("a");
    first->setDescription("b");
    first->setValueType(Elements::FieldType::ValueType::Integer);
    first->setIsBoardVisible(true);

    // Сохранение в тестовую БД.
    gate.saveElement(first);

    // Чтение из тестовой БД и проверка полей.
    auto second = gate.loadElement(Elements::ElementType::FieldType, 1)->elementCast<Elements::FieldType>();
    BOOST_CHECK(1 == second->id());
    BOOST_CHECK(2 == second->itemTypeId());
    BOOST_CHECK("a" == second->caption());
    BOOST_CHECK("b" == second->description());
    BOOST_CHECK(Elements::FieldType::ValueType::Integer == second->valueType());
    BOOST_CHECK(true == second->isBoardVisible());

    // Удаление из тестовой БД и проверка, объект был и удалился.
    BOOST_CHECK(true == Common::contains(gate.getElementsIds(Database::DataFieldType::ids), 1));
    gate.remove(Database::DataFieldType::removeOne, 1);
    BOOST_CHECK(false == Common::contains(gate.getElementsIds(Database::DataFieldType::ids), 1));

    // Удаление всех объектов данного типа из тестовой БД.
    gate.remove(Database::DataFieldType::remove, gate.getElementsIds(Database::DataFieldType::ids));

    // Имитация нового объекта.
    first->setId(0);

    // Сохранение в тестовую БД.
    gate.saveElement(first);

    // Элементу назначен идентификатор при сохранении в БД.
    BOOST_CHECK(0 != first->id());

    // Чтение из тестовой БД и проверка полей.
    auto third = gate.loadElement(Elements::ElementType::FieldType, 1)->elementCast<Elements::FieldType>();
    BOOST_CHECK(1 == third->id());
    BOOST_CHECK(2 == third->itemTypeId());
    BOOST_CHECK("a" == third->caption());
    BOOST_CHECK("b" == third->description());
    BOOST_CHECK(Elements::FieldType::ValueType::Integer == third->valueType());
    BOOST_CHECK(true == third->isBoardVisible());

    // Удаление всех объектов данного типа из тестовой БД.
    gate.remove(Database::DataFieldType::remove, gate.getElementsIds(Database::DataFieldType::ids));
}
